package elev.sim;

import java.util.ArrayList;
import java.util.Collections;

/**
 *
 * @author vegeta
 */
public class Statystyki {

    private static int numerAlgorytmu;
    private static Integer czasPrzejazduPomiedzyPietrami;
    private static ArrayList<Integer> przejechanePietra = new ArrayList();
    private static ArrayList<Integer> rozwiezioneOsoby = new ArrayList();
    private static boolean czyUruchomionaWinda1;
    private static boolean czyUruchomionaWinda2;
    private static int pojemnoscWindy;
    private static ArrayList<Integer> czasPrzebiegu = new ArrayList();
    /*
     * czas oczekiwania: ilosc sekund ktory kazdy pasazer czeka. indeksem jest
     * pasazer, a wartoscia ilosc sekund
     */
    private static ArrayList<Integer> czasOczekiwania = new ArrayList();
    /*
     * czas obslugi: ilosc czasu ktory pasazer spedza w windzie. schemat j/w
     */
    private static ArrayList<Integer> czasObslugi = new ArrayList();

    /**
     * tak naprawde inicjuj staty
     */
    static void zerujStatystyki() {
        przejechanePietra.add(0);
        przejechanePietra.add(0);
        rozwiezioneOsoby.add(0);
        rozwiezioneOsoby.add(0);
        pojemnoscWindy = 0;
        czasPrzebiegu.add(0);
        czasPrzebiegu.add(0);
        czyUruchomionaWinda1 = false;
        czyUruchomionaWinda2 = false;
        //ejj tak dla picu narazie
        czasOczekiwania.add(0);
        czasObslugi.add(0);
    }

    static void zerujStatystyki2() {
        przejechanePietra.set(0, 0);
        przejechanePietra.set(1, 0);
        rozwiezioneOsoby.set(0, 0);
        rozwiezioneOsoby.set(1, 0);
        pojemnoscWindy = 0;
        czasPrzebiegu.set(0, 0);
        czasPrzebiegu.set(1, 0);
        czyUruchomionaWinda1 = false;
        czyUruchomionaWinda2 = false;
        //powinnismy zerowac czas oczekiwania/obslugi
    }

    /**
     * @return the numerAlgorytmu
     */
    public static int getNumerAlgorytmu() {
        return numerAlgorytmu;
    }

    /**
     * @param aNumerAlgorytmu the numerAlgorytmu to set
     */
    public static void setNumerAlgorytmu(int aNumerAlgorytmu) {
        numerAlgorytmu = aNumerAlgorytmu;
    }

    /**
     * @param numerWindy
     * @return the czasPrzebiegu
     */
    public static Integer getCzasPrzebiegu(int numerWindy) {
        return czasPrzebiegu.get(numerWindy);
    }

    /**
     * @param numerWindy
     */
    public static void dodajCzasPrzebiegu(int numerWindy) {
        int tmp = czasPrzebiegu.get(numerWindy);
        tmp++;
        czasPrzebiegu.set(numerWindy, tmp);
    }

    /**
     * @return the przejechanePietra
     */
    public static ArrayList<Integer> getPrzejechanePietra() {
        return przejechanePietra;
    }

    /**
     * @param aPrzejechanePietra the przejechanePietra to set
     */
    public static void setPrzejechanePietra(ArrayList<Integer> aPrzejechanePietra) {
        przejechanePietra = aPrzejechanePietra;
    }

    public static void dodajPrzejechanePietro(int numerWindy) {
        int tmp = przejechanePietra.get(numerWindy);
        tmp++;
        przejechanePietra.set(numerWindy, tmp);
    }

    /**
     * @return the rozwiezioneOsoby
     */
    public static ArrayList<Integer> getRozwiezioneOsoby() {
        return rozwiezioneOsoby;
    }

    /**
     * @param aRozwiezioneOsoby the rozwiezioneOsoby to set
     */
    public static void setRozwiezioneOsoby(ArrayList<Integer> aRozwiezioneOsoby) {
        rozwiezioneOsoby = aRozwiezioneOsoby;
    }

    public static void dodajRozwiezionaOsobe(int numerWindy) {
        int tmp = rozwiezioneOsoby.get(numerWindy);

        tmp++;
        rozwiezioneOsoby.set(numerWindy, tmp);
    }

    /**
     * @return the czyUruchomionaWinda1
     */
    public static boolean isCzyUruchomionaWinda1() {
        return czyUruchomionaWinda1;
    }

    /**
     * @param aCzyUruchomionaWinda1 the czyUruchomionaWinda1 to set
     */
    public static void setCzyUruchomionaWinda1(boolean aCzyUruchomionaWinda1) {
        czyUruchomionaWinda1 = aCzyUruchomionaWinda1;
    }

    /**
     * @return the czyUruchomionaWinda2
     */
    public static boolean isCzyUruchomionaWinda2() {
        return czyUruchomionaWinda2;
    }

    /**
     * @param aCzyUruchomionaWinda2 the czyUruchomionaWinda2 to set
     */
    public static void setCzyUruchomionaWinda2(boolean aCzyUruchomionaWinda2) {
        czyUruchomionaWinda2 = aCzyUruchomionaWinda2;
    }

    /**
     * @return the pojemnoscWindy
     */
    public static int getPojemnoscWindy() {
        return pojemnoscWindy;
    }

    /**
     * @param aPojemnoscWindy the pojemnoscWindy to set
     */
    public static void setPojemnoscWindy(int aPojemnoscWindy) {
        pojemnoscWindy = aPojemnoscWindy;
    }

    /**
     * @return the czasPrzejazduPomiedzyPietrami
     */
    public static int getCzasPrzejazduPomiedzyPietrami() {
        return czasPrzejazduPomiedzyPietrami;
    }

    /**
     * @param aCzasPrzejazduPomiedzyPietrami the czasPrzejazduPomiedzyPietrami
     * to set
     */
    public static void setCzasPrzejazduPomiedzyPietrami(int aCzasPrzejazduPomiedzyPietrami) {
        czasPrzejazduPomiedzyPietrami = aCzasPrzejazduPomiedzyPietrami;
    }

    /**
     * @return the przejechanePietra
     */
    public static ArrayList<Integer> getCzasOczekiwania() {
        return czasOczekiwania;
    }

    /**
     * @param aczasOczekiwania
     */
    public static void setCzasOczekiwania(ArrayList<Integer> aczasOczekiwania) {
        czasOczekiwania = aczasOczekiwania;
    }

    public static void zwieszCzasOczekiwania(int osoba) {
        int tmp = czasOczekiwania.get(osoba);
        tmp++;
        czasOczekiwania.set(osoba, tmp);
    }

    /**
     * Format min/avg/max
     *
     * @return zformatowany czas oczekiwania
     */
    public static String getCzasOczekiwaniaFormatted() {
        
        ///TODO popracowac na zabezpieczniem kiedy te tablice sa puste!!!
        ArrayList<Integer> czasO = new ArrayList(getCzasOczekiwania());
        Collections.sort(czasO);
        //czy to nie zmieni oryginalnej tablicy? nie wiem, jest za pozno - cmos
        int min = czasO.get(0);
        int max = czasO.get(czasO.size() - 1);
        int suma = 0;
        for (int x : czasO) {
            suma += x;
        }
        double avg = (double) suma / czasO.size();

        return min + "/" + avg + "/" + max;
    }

    /**
     * @return the przejechanePietra
     */
    public static ArrayList<Integer> getCzasObslugi() {
        return czasObslugi;
    }

    /**
     * @param aczasObslugi
     */
    public static void setCzasObslugi(ArrayList<Integer> aczasObslugi) {
        czasObslugi = aczasObslugi;
    }

    public static void zwieszCzasObslugi(int osoba) {
        int tmp = czasObslugi.get(osoba);
        tmp++;
        czasObslugi.set(osoba, tmp);
    }

    /**
     * Format min/avg/max
     *
     * @return zformatowany czas obslugi
     */
    public static String getCzasObslugiFormatted() {
        ArrayList<Integer> czasO = new ArrayList(getCzasObslugi());
        Collections.sort(czasO);
        //czy to nie zmieni oryginalnej tablicy? nie wiem, jest za pozno - cmos
        int min = czasO.get(0);
        int max = czasO.get(czasO.size() - 1);
        int suma = 0;
        for (int x : czasO) {
            suma += x;
        }
        double avg = (double) suma / czasO.size();

        return min + "/" + avg + "/" + max;
    }

    @Override
    public String toString() {
        String s = "numer algorytmu: " + numerAlgorytmu + "\n"
                + "pojemnosc wind: " + pojemnoscWindy + "\n"
                + "czas dzialania:    Winda0 " + czasPrzebiegu.get(0) + "  Winda1 " + czasPrzebiegu.get(1) + "\n"
                + "rozwiezione osoby: Winda0 " + rozwiezioneOsoby.get(0) + "  Winda1 " + rozwiezioneOsoby.get(1) + "\n"
                + "przejechane pietra Winda0 " + przejechanePietra.get(0) + "  Winda1 " + przejechanePietra.get(1) + "\n";
        return s;
    }
}
